package com.example.design.demo.single;

/**
 * @author lfj
 * @date 2023/11/10 18:22
 * 懒汉式  (较为完美)
 *  1.声明实例,但是不初始化
 *  2.在构造方法私有化
 *  3.在调取getInstance进行对象返回的时候,判断对象是否为null,是否初始化完成
 *      3.1 初始化完成,既不为null,那就返回对象,否则进行对象的初始化
 *  缺点:  在多线程的访问中是有问题的 ---不安全
 *
 *  修改 01: 在方法内部加锁   加锁的同时,会影响程序的效率
 *      需要进行两次判空,一次判断在多线程的时候,容易造成多次声明对象
 */
public class SingletonLazy03 {

    private static SingletonLazy03 instance=null;

    private SingletonLazy03(){};

    public static  SingletonLazy03 getInstance(){
        if(instance==null){
            synchronized (SingletonLazy03.class) {
                if(instance==null) {
                    try {
                        Thread.sleep(1);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    instance = new SingletonLazy03();
                }
            }
        }
        return instance;

    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(()-> {
                System.out.println(instance.getInstance().hashCode());
            }).start();
        }
    }
}

